iT邦幫忙

DAY 8
9

邁向 RHCE 之路系列 第 8

邁向 RHCE 之路 (Day08) - 標準輸入及輸出、管線

  • 分享至 

  • xImage
  •  

----- 標準輸入及輸出 Standard Input and Output -----
以下為常用數值 (實際上不只此三個數值而是 0 ~ 10)
0: Standard input (STDIN) 預設為鍵盤輸入值
1: Standard output (STDOUT) 預設為終端機螢幕顯示
2: Standard error (STDERR) 預設為終端機螢幕顯示

----- 重新導入符號 -----
以下為常用重新導入符號 (Redirecting Output)
>: Overwrite (預設等於 1>)
&>: Redirect all output (1 ~ 10)
2>&1: Redirect STDERR to STDOUT
>>: Append
|: Pipe
<: Redirect-Input
<<: End-Word

例如下列操作中輸入的指令 ls /tmp 即為 Standard Input (0) 而查詢結果即為 Standard Output (1)。

#ls /root                                  //Standard Input (0)
 anaconda-ks.cfg  install.log  install.log.syslog  //Standard Output(1)

接下來請使用一般使用者帳號 weithenn 來登入系統進行練習,下列操作中即為同時產生了 Standard Input、Standard Output、Standard Error 的結果,跟著進行如下操作完成後相信您會更了解何為 Standard Input、Standard Output、Standard Error。

$find /etc -name passwd       //Standard Input (0)
 /etc/passwd                        //Standard Output (1)
 /etc/pam.d/passwd                  //Standard Output (1)
 find: `/etc/audit': Permission denied   //以下都是 Standard Error (2) 
 find: `/etc/cups/ssl': Permission denied                            
 find: `/etc/ntp/crypto': Permission denied
 find: `/etc/lvm': Permission denied
 find: `/etc/sssd': Permission denied
 find: `/etc/audisp': Permission denied
 find: `/etc/pki/CA/private': Permission denied
 find: `/etc/selinux/targeted/modules/active': Permission denied
 find: `/etc/polkit-1/localauthority': Permission denied
 find: `/etc/dhcp': Permission denied

您也可配合使用 Redirect 符號將您想要得到結果輸出至指定檔案中,如下操作中將 find 搜尋結果 Redirect 至檔案 find.out 中而使用的 Redirect 符號為 > (等於 1>)也就是將 Standard output (1) 結果輸出至檔案 find.out 中,所以您可看到指定執行後畫面只輸出 Standard Error (2) 的結果。

$find /etc -name passwd > find.out       //Standard Input (0)
 find: `/etc/audit': Permission denied
 find: `/etc/cups/ssl': Permission denied
 find: `/etc/ntp/crypto': Permission denied
 ...略...
$cat find.out               //查看 find.out 檔案內容
 /etc/passwd                //剛才指令 Standard Output (1) 的結果
 /etc/pam.d/passwd  

所以若您將 Redirect 符號改變為 2> 也就是將輸出結果為 Standard Error (2) 內容導入至檔案 find.out 中,那麼螢幕上顯示則僅剩 Standard Output (1)。

$find /etc -name passwd 2> find.out    //Standard Input (0)
 /etc/pam.d/passwd                           //Standard Output (1)
 /etc/passwd
$cat find.out                           //查看 find.out 檔案內容
 find: `/etc/audit': Permission denied  //剛才 Standard Error (2) 的結果
 find: `/etc/cups/ssl': Permission denied
 find: `/etc/ntp/crypto': Permission denied
 ...略...

當然您也可利用多個 Argument 來達成將 Standard Output (1) 及 Standard Error (2) 結果導至不同的檔案。

$find /etc -name passwd > find.out 2> find.err
$cat find.out
 /etc/passwd
 /etc/pam.d/passwd
$cat find.err
 find: `/etc/audit': Permission denied
 find: `/etc/cups/ssl': Permission denied
 find: `/etc/ntp/crypto': Permission denied
 ...略...

若您不想寫那麼多的話您可利用 2>&1 來達成,不過在使用上要注意其位置,否則可能輸出的結果不是您想要的結果,如下為將 find 指令執行結果 Standard Output (1) 輸出至檔案 find.out 中在透過 2>&1 符號 Redirect STDERR to STDOUT 所以在 find.out 中內容為 Standard Output (1) 及 Standard Error (2)。

$find /etc -name passwd > find.out 2>&1
$cat find.out
 /etc/passwd
 /etc/pam.d/passwd
 find: `/etc/audit': Permission denied
 find: `/etc/cups/ssl': Permission denied
 find: `/etc/ntp/crypto': Permission denied
 ...略...

將 find 指令執行結果 Standard Error (2) 顯示至終端 (螢幕) 而將 Standard Output (1) 結果 Redirect 至檔案 find.out 中。

$find /etc -name passwd 2>&1 > find.out
 find: `/etc/audit': Permission denied
 find: `/etc/cups/ssl': Permission denied
 find: `/etc/ntp/crypto': Permission denied
 ...略...
$cat find.out
 /etc/passwd
 /etc/pam.d/passwd

----- 管理 (Piping) -----
我們可利用管線 (|) Pipe 來使上個指令的輸出結果變成為下個指令的輸入,如下指令配合 Pipe 應該可輕鬆顯示目前網路卡上的 IP Address。

#ls -l /dev |grep std
 lrwxrwxrwx. 1 root root    15 Oct  7 17:41 stderr -> /proc/self/fd/2
 lrwxrwxrwx. 1 root root    15 Oct  7 17:41 stdin -> /proc/self/fd/0
 lrwxrwxrwx. 1 root root    15 Oct  7 17:41 stdout -> /proc/self/fd/1

也可使用 Pipe 來達成將 Mail 內容快速輸入的效果,例如使用指令來寄送 Mail
方式一 將檔案內容直接轉換為郵件內容

#mail -s "test1" weithenn < /etc/s*/n*s/ifcfg-eth0

方式二 透過 echo 及 Pipe 將簡單字串輸入至郵件內容中

#echo "Test Mail 2" | mail -s "test2" weithenn

方式三 利用互動模式手動輸入郵件內容

#mail -s "test3" weithenn          //輸入後按下 Enter
 Test Mail 3                       //郵件內容
 .                                 //表示郵件內容結束
 EOT

接著可以使用指令 mail 讀取系統郵件,常用操作如下:

$mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/weithenn": 3 messages 1 new 2 unread
    1 root                  Tue Oct 11 10:31  25/684   "test1"
 U  2 root                  Tue Oct 11 10:32  19/574   "test2"
>N  3 root                  Tue Oct 11 10:32  18/564   "test3"
>number: 讀取指定郵件 (每封郵件前皆有數字)
>d 1-3: 刪除第 1 ~ 3 封郵件
>x: 離開,但郵件留在 MailBox 中 (下次進入還會看到讀取過的 Mail)
>g: 離開,讀取過的郵件將轉移至 ~/mbox 中
>h: 顯示所有信件

(上一篇)邁向 RHCE 之路 (Day07) - Shell 環境變數、別名 (Aliases)、跳脫字元
(下一篇)邁向 RHCE 之路 (Day09) - 正規表示式 (Regular Expression)
邁向 RHCE 之路系列文章連結


上一篇
邁向 RHCE 之路 (Day07) - Shell 環境變數、別名 (Aliases)、跳脫字元
下一篇
邁向 RHCE 之路 (Day09) - 正規表示式 (Regular Expression)
系列文
邁向 RHCE 之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
chiounan
iT邦研究生 1 級 ‧ 2011-10-15 21:32:42

謝謝
終於搞懂 2>&1

weithenn iT邦新手 4 級 ‧ 2011-10-16 09:26:27 檢舉

呵,很高興對您有幫助!! 臉紅

我要留言

立即登入留言